package 中等.双指针;

/**
 * 给你一个二进制数组 nums ，你需要从中删掉一个元素。
 * 请你在删掉元素的结果数组中，返回最长的且只包含 1 的非空子数组的长度。
 * 如果不存在这样的子数组，请返回 0 。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/longest-subarray-of-1s-after-deleting-one-element
 */
public class 删掉一个元素以后全为1的最长子数组_1493 {

    public static void main(String[] args) {

        int[] nums = {1, 1, 1};
        System.out.println(longestSubarray(nums));

    }

    /**
     * 三指针
     * 记录最近三个 0 所在的索引位置
     * 那么只包含一个0的连续子数组长度 == curZero - pre2Zero - 2
     *
     * @param nums
     * @return
     */
    public static int longestSubarray(int[] nums) {
        int ans = 0;
        // 第一次碰到三个0索引时，只需要减去一个多余的 0
        int pre2Zero = -1, pre1Zero = 0;
        while (pre1Zero < nums.length && nums[pre1Zero] == 1) pre1Zero++;
        // 数组中全为 1 时，必须减去一个数字
        if (pre1Zero == nums.length) return nums.length - 1;
        int curZero = pre1Zero + 1;
        while (curZero < nums.length) {
            while (curZero < nums.length && nums[curZero] == 1) curZero++;
            ans = Math.max(curZero - pre2Zero - 2, ans);
            pre2Zero = pre1Zero;
            pre1Zero = curZero;
            curZero++;
        }
        return ans;
    }

}
